home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / mdisk25.arj / MXMSST.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-09-29  |  4.6 KB  |  164 lines

  1. {$A+,B-,D-,E-,F+,G+,I-,L-,N-,O-,R-,S-,V+,X-}
  2.  
  3. Unit Mxmsst;
  4. Interface
  5. Uses Mxms,Objects;
  6.  
  7. { (c) Emilio David Diaus López 1994                        }
  8. { Flujo "stream" para el control de la memoria extendida   }
  9. { Es un equivalente a PEMSstream pero en vez de utilizar   }
  10. { memoria expandida utiliza memoria extendida o ampliada   }
  11. { Se deriva de Tstream y los métodos que hay que cambiar   }
  12. { cambiar siempre que se derive un stream de Tstream son:  }
  13. { GetPos,GetSize, Read, Seek, Truncate y Write y si fuera  }
  14. { un stream con buffer habría que cambiar el método Flush  }
  15.  
  16. { Se considera el flujo como si fuera un fichero del disco }
  17. { y se pueden llevar a cabo las mismas operaciones que en  }
  18. { Tdosstream o Tstream                                     }
  19.  
  20. {
  21. 6. Mxmsst: Control De La Memoria Extendida Mediante
  22. Flujos
  23.  
  24. Este MóDulo Es Una AmpliacióN De Los Objetos Tstream Como
  25. Tdosstream Y Temsstream, Utiliza El MóDulo Mxms Para La Gestión
  26. De La Memoria Extendida Crea Un Objeto Txmsstream Descendiente
  27. De Tstream Así Se Puede Configurar FáCilmente Para El Manejo De
  28. Memoria Extendida, Expandida O Disco Duro Con Un Solo Objeto
  29. Variable, Cambia Los MéTodos Getpos, Getsize, Read, Seek,
  30. Truncate Y Write Y Si Fuera Un Stream Con BúFer HabríA Que
  31. Cambiar El MéTodo Flush, Este Es El Procedimiento EstáNdar Para
  32. Derivar De Tstream Otro "Flujo", Se Considera El Flujo Como Si
  33. Fuera Un Fichero Del Disco  Y Se Pueden Llevar A Cabo Las Mismas
  34. Operaciones Que En  Tdosstream O Tstream En El Fichero De CóDigo
  35. Fuente Se Puede Encontrar Mas InformacióN.
  36. }
  37.  
  38. Type Pxmsstream=^Txmsstream;
  39.      Txmsstream=Object(Tstream) { derivación de Tstream }
  40.  
  41.      { métodos y variables públicas }
  42.  
  43.        Constructor Init(Asize:Longint);
  44.        Destructor Done;Virtual;
  45.  
  46.        Function Getpos:Longint;Virtual;
  47.        Function Getsize:Longint;Virtual;
  48.  
  49.        Procedure Write(Var Buf;Count:Word);Virtual;
  50.        Procedure Read(Var Buf;Count:Word);Virtual;
  51.        Procedure Seek(Pos:Longint);Virtual;
  52.        Procedure Truncate;Virtual;
  53.  
  54.      { métodos y variables privadas }
  55.  
  56.      Private
  57.        Handle:Word;
  58.        Position:Longint;
  59.        Size:Longint;
  60.      End;
  61.  
  62.  
  63. Implementation
  64.  
  65. { inicialización del flujo }
  66.  
  67. Constructor Txmsstream.Init;
  68. Begin
  69.      Tstream.Init;
  70.      Position:=0;
  71.      Size:=Asize;
  72.      If Not(Hayxms) Then Fail;
  73.      Handle:=Nuevo_Bloque((Asize+1) Div 1024);
  74.      If Error_Xms<>0 Then Begin       { si no hay suficiente XMS se  }
  75.                                       { interrumpe la inicialización }
  76.         Fail;                         { del flujo                    }
  77.      End;
  78. End;
  79.  
  80. { dispone y finaliza el flujo }
  81.  
  82. Destructor Txmsstream.Done;
  83. Begin
  84.      Dispon_Bloque(Handle);
  85.      Tstream.Done;
  86. End;
  87.  
  88. { devuelve el tamaño del flujo }
  89.  
  90. Function Txmsstream.Getsize:Longint;
  91. Begin
  92.      Getsize:=Size;
  93. End;
  94.  
  95. { devuelve la posición del puntero del ofset del flujo }
  96.  
  97. Function Txmsstream.Getpos:Longint;
  98. Begin
  99.      Getpos:=Position;
  100. End;
  101.  
  102. { escribe count bytes en el flujo }
  103.  
  104. Procedure Txmsstream.Write(Var Buf;Count:Word);
  105. Var Lbuf:Longint;
  106.     Pos:Longint;
  107. Begin
  108.      Lbuf:=Longint(@Buf);
  109.      Pos:=Getpos;
  110.      If Count Mod 2<>0 Then Inc(Count);
  111.      Mover_Bloque_Emb(0,Lbuf,Handle,Pos,Count);
  112.      If Count Mod 2<>0 Then Dec(Count);
  113.      If Error_Xms<>0 Then Begin
  114.         Error(Error_Xms,Stwriteerror);
  115.      End;
  116.      Seek(Position+Count); { actualiza el puntero de ofset }
  117. End;
  118.  
  119. { lee count bytes del flujo }
  120.  
  121. Procedure Txmsstream.Read(Var Buf;Count:Word);
  122. Var Lbuf:Longint;
  123.     Pos:Longint;
  124. Begin
  125.      Lbuf:=Longint(@Buf);
  126.      Pos:=Getpos;
  127.      If Count Mod 2<>0 Then Inc(Count);
  128.      Mover_Bloque_Emb(Handle,Pos,0,Lbuf,Count);
  129.      If Count Mod 2<>0 Then Dec(Count);
  130.      If Error_Xms<>0 Then Begin
  131.         Error(Error_Xms,Streaderror);
  132.      End;
  133.      Seek(Position+Count); { actualiza el puntero de ofset }
  134. End;
  135.  
  136. { Coloca el puntero en una posición determinada respecto del }
  137. { principio del flujo y a partir de ahí leer o escribir      }
  138.  
  139. Procedure Txmsstream.Seek(Pos:Longint);
  140. Begin
  141.      If Pos<=Getsize Then
  142.         Position:=Pos
  143.      Else
  144.          Error(0,Sterror);
  145. End;
  146.  
  147. { trunca el flujo a la posición actual del puntero de ofset }
  148.  
  149. Procedure Txmsstream.Truncate;
  150. Var Bien:Boolean;
  151. Begin
  152.      Seek(Position);
  153.      Bien:=Cambiar_Tamano_Bloque(Handle,Position Div 1024);
  154.      If Not(Bien) Then Begin
  155.         Error(Error_Xms,Sterror);
  156.         Exit;
  157.      End;
  158.      Bien:=Cambiar_Tamano_Bloque(Handle,Size Div 1024);
  159.      If Not(Bien) Then
  160.         Error(Error_Xms,Sterror);
  161. End;
  162.  
  163. End.
  164.